package zxs.sino.elite.hub.utils;

import java.security.SecureRandom;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicInteger;

public class GeneratorUtil {

    // 最后使用的时间戳（秒级）
    private static long lastTimestamp = 0;
    // 序列号生成器（0-999）
    private static final AtomicInteger SEQUENCE = new AtomicInteger(0);
    // 日期格式化器（YYMMDD）
    private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyMMdd");
    // 秒格式化器（00-59）
    private static final DateTimeFormatter SECOND_FORMAT = DateTimeFormatter.ofPattern("ss");

    /**
     * 生成用户编号
     * @return
     * @throws InterruptedException
     */
    public static synchronized String generateUserId() throws InterruptedException {
        while (true) {
            // 1. 获取当前时间（毫秒级）
            long currentTimeMillis = System.currentTimeMillis();
            long currentSecond = currentTimeMillis / 1000;

            // 2. 转换为日期时间对象
            final LocalDateTime now = LocalDateTime.ofEpochSecond(
                    currentSecond,
                    0,
                    java.time.ZoneOffset.UTC
            );

            // 3. 生成时间部分：YYMMDD + ss（共8位）
            final String datePart = now.format(DATE_FORMAT);
            final String secondPart = now.format(SECOND_FORMAT);

            // 替换第4步的异常抛出为等待策略
            while (currentSecond < lastTimestamp) {
                // 等待10ms后重试
                Thread.sleep(10);
                currentTimeMillis = System.currentTimeMillis();
                currentSecond = currentTimeMillis / 1000;
            }


            // 5. 重置序列号（新秒级周期）
            if (currentSecond > lastTimestamp) {
                SEQUENCE.set(0);
                lastTimestamp = currentSecond;
            }

            // 6. 获取并递增序列号（0-999）
            final int seqValue = SEQUENCE.getAndIncrement();

            // 7. 处理序列号溢出（等待下一秒）
            if (seqValue > 999) {
                try {
                    // 等待1毫秒后重试
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
                continue;
            }

            // 8. 组合最终ID：YYMMDD(6) + ss(2) + seq(3)
            return datePart + secondPart + String.format("%03d", seqValue);
        }
    }


    /**
     * 生成密码盐
     */
    public static String generateSalt() {
        SecureRandom secureRandom = new SecureRandom();
        byte[] salt = new byte[16];
        secureRandom.nextBytes(salt);

        StringBuilder sb = new StringBuilder();
        for (byte b : salt) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}
